<?php


\config\app.php
    'providers' => [
        ...
        Illuminate\Cookie\CookieServiceProvider::class,
        ...
    ]

\app\Http\Kernel.php
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

对于web 中间件的路由来说，使用到了 cookie 的，用于存储 session。
Illuminate\Cookie\CookieServiceProvider::class,
和
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
是密切相关的。

只要有 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
就必须有 Illuminate\Cookie\CookieServiceProvider::class,

至于 \App\Http\Middleware\EncryptCookies::class,
测试时没有关系，有它，此时也可以注释掉 Illuminate\Cookie\CookieServiceProvider::class,

只要注释掉 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
其他两个随便，事先清除该域名下的所有 cookie，然后浏览器请求，响应头中都不会有 cookie 了。
神奇的一个现象：
把这三个注释后再取消注释，浏览器访问，不再响应cookie 了，导致没有了 session 的 cookie，每次请求都会创建一个新的 session 文件。
执行 return response('ok')->withCookie('name','aaa',10); 会重新生成三个 cookie：
string(4) "name" 
string(10) "XSRF-TOKEN" 
string(15) "laravel_session" 

setcookie() 在 
\vendor\symfony\http-foundation\Response.php 中的 public function sendHeaders() 方法内执行的。
    public function sendHeaders()
    {
        // headers have already been sent by the developer
        if (headers_sent()) {
            return $this;
        }

        if (!$this->headers->has('Date')) {
            $this->setDate(\DateTime::createFromFormat('U', time()));
        }

        // headers
        foreach ($this->headers->allPreserveCase() as $name => $values) {
            foreach ($values as $value) {
                header($name.': '.$value, false, $this->statusCode);
            }
        }

        // status
        header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);

        // cookies
        foreach ($this->headers->getCookies() as $cookie) {
            if ($cookie->isRaw()) {
                setrawcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
            } else {
                // 上面三个cookie 的名称就是在这里打印的；
                // var_dump($cookie->getName());echo '<br/>';
                setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
            }
        }

        return $this;
    }

通过测试知道了原因。
headers_sent($_file, $_line) 结果为真；导致方法 sendHeaders() 结束。
而此时
var_dump($_file);echo '<br/>';
var_dump($_line);echo '<br/>';
依次打印：
string(98) "D:\project\study\study-php-laravel\laravel5331\vendor\symfony\var-dumper\Dumper\AbstractDumper.php" 
int(156) 
而 156 行正是
    protected function echoLine($line, $depth, $indentPad)
    {
        if (-1 !== $depth) {
            fwrite($this->outputStream, str_repeat($indentPad, $depth).$line."\n");
        }
    }
只要把 fwrite(handle, string) 这行注释掉，就行了。
归根结底，是在控制器的方法中使用了 dump() 导致的。
dump() 使用了这个方法。
当把 fwrite(handle, string) 注释掉后，响应 cookie 了，但 dump() 也失去了本来的样式。
在不注释 fwrite(handle, string) 的情况下，不使用 dump()，改成 echo。
    如果此时 echo 后直接 exit，程序结束，自然也就无法执行 sendHeaders() 方法了。发现也不响应 session 的 cookie 了，也没有其他的cookie。
    仅仅 echo，不exit，则正常响应两个 cookie：
    string(10) "XSRF-TOKEN" 
    string(15) "laravel_session" 
同样的，可以使用 dump()，直接跟 exit，有样式，但肯定没有响应 cookie。
完毕。

fwrite($this->outputStream, str_repeat($indentPad, $depth).$line."\n");
往响应流中写东西了，导致响应头发送出去。